<?php

/**
 * Description of base
 *
 * @author zhangyazhong By 2013-5-18 16:19:52
 * @editor	zhujianjun	By	2013/12/05	20:40
 * 
 * Info：
 */
class model_base extends framework_base_model{
    protected $link;
	/*
	 * 最后插入的记录ID
	 * @author zhujianjun
	 * @var integer
	 * @access public
	 */
	public $lastInsertId = '';

	/*
	 * 返回影响记录数
	 * @author zhujianjun
	 * @var integer
	 * @access public
	 */
	public $numRows = 0;
    /*
     * 查询结果
	 * @author zhujianjun
     */
    protected $PDOStatement = null;

    function __construct() {
        $this->link = framework_base_pdomysql::connect();
    }

	/*
	 * 绑定变量/占位符 查询所有记录
	 * @author zhujianjun
	 * @sql 占位符形式的SQL语句
	 * @params 解析占位符所需的参数
	 * @params 参数如下
	 * @parameter  参数标识符
	 * @variable  绑定到 SQL 语句参数的 PHP 变量名
	 * @data_type  常量明确地指定参数的类型
	 * @length	数据类型的长度
	 */
	function bindFindAll($sql = null, $params = array()) {
		if (!isset($sql)) {
			return false;
		}
		if (empty($params)) {
			return false;
		}
		$this->query($sql);
		foreach ($params as $param) {
			if (!isset($param['length'])) {
				$this->PDOStatement->bindParam($param['parameter'], $param['variable'], constant($param['data_type']));
			} else {
				// 限制长度
				$this->PDOStatement->bindParam($param['parameter'], $param['variable'], constant($param['data_type']), $param['length']);
			}
		} 
		$this->PDOStatement->execute();
		$result = $this->PDOStatement->fetchAll();
		return $result;
	}

	/*
	 * 绑定变量/占位符 查询单条记录
	 * @author zhujianjun
	 * @sql 占位符形式的SQL语句
	 * @params 解析占位符所需的参数
	 * @params 参数如下
	 * @parameter  参数标识符
	 * @variable  绑定到 SQL 语句参数的 PHP 变量名
	 * @data_type  常量明确地指定参数的类型
	 * @length	数据类型的长度
	 */
	function bindFind($sql = null, $params = array()) {
		if (!isset($sql)) {
			return false;
		}
		if (empty($params)) {
			return false;
		}
		$this->query($sql);
		foreach ($params as $param) {
			if (!isset($param['length'])) {
				$this->PDOStatement->bindParam($param['parameter'], $param['variable'], constant($param['data_type']));
			} else {
				// 限制长度
				$this->PDOStatement->bindParam($param['parameter'], $param['variable'], constant($param['data_type']), $param['length']);
			}
		} 
		$this->PDOStatement->execute();
		$result = $this->PDOStatement->fetch();
		return $result;
	}

	/* 插入记录
	 * 绑定变量/占位符 
	 * @author zhujianjun
	 * @sql 占位符形式的SQL语句
	 * @params 解析占位符所需的参数
	 * @params 参数如下
	 * @parameter  参数标识符
	 * @variable  绑定到 SQL 语句参数的 PHP 变量名
	 * @data_type  常量明确地指定参数的类型
	 * @length	数据类型的长度
	 */
	function bindInsert($sql = null, $params = array()) {
		if (!isset($sql)) {
			return false;
		}
		if (empty($params)) {
			return false;
		}
		$this->query($sql);
		try {
			$this->link->dbh->beginTransaction();
			foreach ($params as $param) {
				if (!isset($param['length'])) {
					$this->PDOStatement->bindParam($param['parameter'], $param['variable'], constant($param['data_type']));
				} else {
					// 限制长度
					$this->PDOStatement->bindParam($param['parameter'], $param['variable'], constant($param['data_type']), $param['length']);
				}
			} 
			$result = $this->PDOStatement->execute();
			$lastInsertId = $this->link->dbh->lastInsertId();
			$this->link->dbh->commit();
			return $lastInsertId;
		} catch (Exception $e) {
			$this->link->dbh->rollback();
			return false;
		}
	}

	/* 修改记录
	 * 绑定变量/占位符 
	 * @author zhujianjun
	 * @date 2013-08-09 10:25
	 * @sql 占位符形式的SQL语句
	 * @params 解析占位符所需的参数
	 * @params 参数如下
	 * @parameter  参数标识符
	 * @variable  绑定到 SQL 语句参数的 PHP 变量名
	 * @data_type  常量明确地指定参数的类型
	 * @length	数据类型的长度
	 */
	function bindUpdate($sql = null, $params = array()) {
		if (!isset($sql)) {
			return false;
		}
		if (empty($params)) {
			return false;
		}
		$this->query($sql);
		try {
			$this->link->dbh->beginTransaction();
			foreach ($params as $param) {
				if (!isset($param['length'])) {
					$this->PDOStatement->bindParam($param['parameter'], $param['variable'], constant($param['data_type']));
				} else {
					// 限制长度
					$this->PDOStatement->bindParam($param['parameter'], $param['variable'], constant($param['data_type']), $param['length']);
				}
			} 
			$result = $this->PDOStatement->execute();
			$this->link->dbh->commit();
			return $result;
		} catch (Exception $e) {
			$this->link->dbh->rollback();
			return false;
		}
	}

	/* 删除记录
	 * 绑定变量/占位符 
	 * @author zhujianjun
	 * @date 2013-08-09 11:40
	 * @sql 占位符形式的SQL语句
	 * @params 解析占位符所需的参数
	 * @params 参数如下
	 * @parameter  参数标识符
	 * @variable  绑定到 SQL 语句参数的 PHP 变量名
	 * @data_type  常量明确地指定参数的类型
	 * @length	数据类型的长度
	 */
	function bindDrop($sql = null, $params = array()) {
		if (!isset($sql)) {
			return false;
		}
		if (empty($params)) {
			return false;
		}
		$this->query($sql);
		try {
			$this->link->dbh->beginTransaction();
			foreach ($params as $param) {
				if (!isset($param['length'])) {
					$this->PDOStatement->bindParam($param['parameter'], $param['variable'], constant($param['data_type']));
				} else {
					// 限制长度
					$this->PDOStatement->bindParam($param['parameter'], $param['variable'], constant($param['data_type']), $param['length']);
				}
			} 
			$result = $this->PDOStatement->execute();
			$this->link->dbh->commit();
			return $result;
		} catch (Exception $e) {
			$this->link->dbh->rollback();
			return false;
		}
	}


	/*
	 * SQL 语句 查询所有记录
	 * @author zhujianjun
	 */
	public function getAll ($sql = null) {
		if (!isset($sql)) {
			return false;
		}
		$this->query($sql);
		$this->PDOStatement->execute();
		$result = $this->PDOStatement->fetchAll();
		//$result = $this->PDOStatement->fetchAll(constant('PDO::FETCH_NUM')); //返回一个索引为以0开始的结果集列号的数组
		return $result;
	}

	/*
	 * SQL 语句 查询单条记录
	 * @author zhujianjun
	 */
	public function getRow ($sql = null) {
		if (!isset($sql)) {
			return false;
		}
		$this->query($sql);
		$this->PDOStatement->execute();
		$result = $this->PDOStatement->fetch();
		//$result = $this->PDOStatement->fetch(constant('PDO::FETCH_ASSOC')); //返回一个索引为结果集列名的数组
		return $result;
	}
	

    /*
     * 预执行语句
	 * @author zhujianjun
     */

    protected function query($sql = null) {
        if (!isset($sql)) {
            return false;
        }
        if (!isset($this->link)) {
            return false;
        }
        if (isset($this->PDOStatement)) {
            $this->free();
        }
        $this->PDOStatement = $this->link->dbh->prepare($sql);
    }

    /*
     * 释放查询结果
	 * @author zhujianjun
     */

    public function free() {
        $this->PDOStatement = null;
    }
    
    /**
     * 处理prepare的字符串
     */
    public static function str4prepare($arr) {
        $return = '';
        $i = 0;
        foreach ($arr as $k => $v) {
            $return .= $k . '=:' . $k;
            if ($i < count($arr) - 1)
                $return .= ",";
            ++$i;
        }
        return $return;
    }

    /**
     * 根据数组返回表字段
     */
    public static function getTabField($arr)
    {
        $tabField = implode('`, `', array_keys($arr));
        $tabField = '`' . $tabField . '`';
        return $tabField;
    }
    
    /**
     * 根据数组返回预处理占位符
     */
    public static function getValField($arr)
    {
        $valField = implode(', :', array_keys($arr));
        $valField = ':' . $valField;
        return $valField;
    }
}
